#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<strings.h>
#include<string.h>
#include<sys/types.h>
#include<signal.h>
#include<sys/fcntl.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/wait.h>
#include"tools.h"
#include"msgqueue.h"
#include"struct.h"
#include"get_keyboard.h"

static int msgid_ctos;
static int msgid_stoc;

static Msg_ctos msg_ctos;
static Msg_stoc msg_stoc;

static int flag=0;

void msg_send(void)
{
	if(-1==msgsnd(msgid_ctos,&msg_ctos,sizeof(msg_ctos)-4,0))
	{
		perror("msgsnd");
		_exit(-1);
	}
}
void msg_rcv(void)
{
	if(-1==msgrcv(msgid_stoc,&msg_stoc,sizeof(msg_stoc),msg_stoc.m_type,0))
	{
		perror("msgrcv");
		_exit(-1);
	}
	show_msg(msg_stoc.m_str,3);
}

void show_menu1(void)
{
	clears();

    puts("          ATM          ");  
    puts("-----------------------");
	puts(" 1、开户      2、销户    ");
	puts(" 3、登录      4、解冻    ");
	puts(" 0、退出                ");
	puts("-----------------------");
}
void show_menu2(void)
{
	clears();  
    puts("          ATM          ");
    puts("-----------------------");   
	puts(" 1、存钱      2、取钱    ");
	puts(" 3、转帐      4、查询    ");
	puts(" 5、修改密码  0、退出    ");
	puts("----------------------");
}
void open_id(void)
{
	getchar();
	printf("请输入姓名：");
	get_str(msg_ctos.m_cli.name,sizeof(msg_ctos.m_cli.name));


	printf("请输入身份证号码：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	
	printf("请输入预存金额：");
	scanf("%f",&msg_ctos.m_cli.money);
	msg_ctos.m_type=M_OPEN;
}
void destroy(void)
{
	getchar();
	printf("请输入要注销的帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);
	getchar();

	printf("请输入要注销的身份证号：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	msg_ctos.m_type=M_DESTROY;
}
void unlock(void)
{
	getchar();
	printf("请输入解锁的帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);
	getchar();

	printf("请输入身份证号：");
	get_str(msg_ctos.m_cli.id,sizeof(msg_ctos.m_cli.id));
	
	msg_ctos.m_type=M_UNLOCK;
	
}
void login(void)
{
	getchar();
	printf("请输入帐号：");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码：");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));
	msg_ctos.m_type=M_LOGIN;

}
void save(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入存款金额:");
	scanf("%f",&msg_ctos.m_cli.money);
	
	msg_ctos.m_type = M_SAVE;
}

void take(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入取款金额:");
	scanf("%f",&msg_ctos.m_cli.money);

	msg_ctos.m_type = M_TAKE;

}

void look(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	msg_ctos.m_type = M_LOOK;
}

void transf(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入要转入的帐号：");
	get_str(msg_ctos.m_cli.otherid,sizeof(msg_ctos.m_cli.otherid));

	printf("请输入转帐金额：");
	scanf("%f",&msg_ctos.m_cli.money);


	msg_ctos.m_type = M_TRANSF;
}
void amend(void)
{
	printf("请输入帐号:");
	scanf("%d",&msg_ctos.m_cli.cliid);

	printf("请输入旧密码:");
	get_pwd(msg_ctos.m_cli.passwd,sizeof(msg_ctos.m_cli.passwd));

	printf("请输入新密码：");
	get_pwd(msg_ctos.m_cli.otherid,sizeof(msg_ctos.m_cli.otherid));



	msg_ctos.m_type = M_AMEND;
}

void main()
{
	msgid_ctos=get_ctos_msg();
	msgid_stoc=get_stoc_msg();

	msg_stoc.m_type=msg_ctos.m_pid=getpid();
 
	while(1)
	{
		show_menu1();
		
		switch(get_cmd('0','4')-'0')
		{
			case M_EXIT: return;
			case M_OPEN:open_id(); break;
			case M_DESTROY:destroy();break;
			case M_LOGIN:login();break;
			case M_UNLOCK:unlock();break;
		}

		msg_send();
		msg_rcv();

		if(0==strcmp(msg_stoc.m_str,"yes"))
		{
			break;
		}
	}
	while(1)
	{
		show_menu2();
		switch((get_cmd('0','5')-'0')+4)
		{
			case 4: return;
			case M_SAVE:save();break;
			case M_TAKE:take();break;
			case M_TRANSF:transf();break;
			case M_LOOK:look();break;
			case M_AMEND:amend();break;
		}

		msg_send();
		msg_rcv();

	}

	
}

